package com.ruoyi.common.BaseMapper;

import java.lang.annotation.*;
import java.io.Serializable;
import java.util.function.Function;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;

/**
 * @Classname Query
 * @Description 实体字段查询注解，用于MyBatis Plus的动态查询和多表关联查询
 * @Date 2025/10/15 11:52
 * @Created by 陈九常
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Query {
    // 查询类型（默认精确匹配）
    Type type() default Type.EQ;

    // 数据库字段名（默认为空，自动转下划线）
    String column() default "";

    // 范围查询标记（用于时间范围）
    Range range() default Range.NONE;
    
    // 关联实体类（优先级高于joinTable）
    Class<?> joinEntity() default Object.class;
    
    // 关联表名（当joinEntity为Object.class时使用）
    String joinTable() default "";
    
    // 主表关联字段（字符串形式）
    String mainField() default "";
    
    // 关联表关联字段（字符串形式）
    String joinField() default "";
    
    // 主表关联方法引用（支持Lambda表达式）
    String mainFieldFunc() default "";
    
    // 关联表关联方法引用（支持Lambda表达式）
    String joinFieldFunc() default "";
    
    // 连接类型
    JoinType joinType() default JoinType.LEFT;
    
    /**
     * 连接类型枚举
     */
    enum JoinType {
        LEFT,      // 左连接
        RIGHT,     // 右连接
        INNER,     // 内连接
        FULL;      // 全连接
    }
    
    /**
     * 获取关联查询的Lambda表达式字段名
     * 注意：由于Java注解不支持直接引用方法引用，此方法用于在运行时解析方法引用
     */
    class LambdaField {
        // 工具方法，用于将方法引用转换为字段名
        public static String getLambdaFieldName(SFunction<?, ?> func) {
            // 实际实现会依赖MyBatis-Plus的内部机制来解析Lambda表达式
            // 这里仅作示意，具体实现会在运行时通过MPJ的工具类解析
            return "";
        }
    }

    enum Type {
        // 等于
        EQ,
        // 模糊
        LIKE,
        // 范围
        BETWEEN,
        // 大于
        GT,
        // 小于
        LT,
        // 大于等于
        GTE,
        // 小于等于
        LTE,
        // 不等于
        NE,
        // 左模糊
        LIKE_LEFT,
        // 右模糊
        LIKE_RIGHT,
        // 不在范围
        NOT_BETWEEN,
        // 不包含
        NOT_LIKE;
    }

    enum Range {
        NONE, START, END
    }
}
